#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NAME "xkl"

int main()
{

  pid_t id = fork();
  if(id == 0)
  {
    int cnt = 5;
    while(cnt > 0)
    {
      printf("我是子进程，我在呢，pid：%d，ppid：%d，我还要%ds\n", getpid(), getppid(), --cnt);
      sleep(1);
    }
    exit(0);
  }
  
  while(1)
  {

    int st;
    pid_t ret = waitpid(id, &st, WNOHANG);
    if(ret > 0)
    {
      printf("我是父进程，我等待成功，ret：%d, st: %d\n", ret, (st>>8)&0xFF);
      exit(0);
    }
    else
    {
      printf("我是父进程，子进程还没好呢\n");
      sleep(1);
      continue;
    }
  }

  
//  printf("hello");
//  //exit(0);
//  _exit(0);

  
//  for(int i = 0; i < 200; ++i)
//  {
//    printf("%d -> %s\n", i, strerror(i));
//  }
  
  return 0;

// --------------------------------------------------------------------------------------
// 进程地址空间  
//  if(strcmp(argv[1], "-a") == 0) printf("打印当前目录下的文件名\n");
//    else if(strcmp(argv[1], "-b") == 0) printf("打印当前目录下的文件的详细信息\n");
//    else if(strcmp(argv[1], "-c") == 0) printf("打印当前目录下的文件名(包含隐藏文件)\n");
//    else printf("其他功能，待开发\n");
  //printf("hello = %s\n", getenv("hello"));
  //char* user = getenv("USER");
  //if(strcmp(user, NAME) == 0)
  //{
  //  printf("USER:%s  是本人操作\n", getenv("USER"));
  //}
  //else
  //{
  //  printf("USER:%s 非法用户！\n", getenv("USER"));
  //}

  
//  printf("%s\n", getenv("PATH"));
//
//  printf("%s\n", getenv("HOME"));
//  printf("%s\n", getenv("USER"));

//  指针数组访问环境变量表
//  extern char **environ;
//  for(int i = 0; environ[i];++i)
//  {
//    printf("%s\n", environ[i]);
//  }


//  for(int i = 0; envp[i]; ++i)
//  {
//    printf("%s\n", envp[i]);
//  }







// 孤儿进程
//  pid_t id = fork();
//
//  if(id == 0)
//  {
//    // child
//    while(1)
//    {
//      printf("我是子进程，pid：%d, ppid: %d\n", getpid(), getppid());
//      sleep(1);
//    }
//
//  }else if(id > 0)
//  {
//    // father
//    int cnt = 5;
//    while(cnt > 0)
//    {
//      printf("我是父进程，pid：%d, ppid: %d\n", getpid(), getppid());
//      sleep(1);
//      --cnt;
//    }
//  }
//  return 0;
}
